package jogoprojetopi;

import java.awt.Rectangle;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import s3t.gameControl.system.GameSystem;
import s3t.gameElements.*;
import s3t.graphicsElements.ImageCollection;
import s3t.graphicsElements.SimpleImage;

public class ControleDoPersonagem extends AIAction
{
    private Direcoes acao = Direcoes.NENHUM; //ENUM de direçõs
    private int vidas = 3;
    //variáveis que dizem a posição do tido dada pela direção em que o jogador está andando
    private int posicaoYDoTiro = 0;
    private int posicaoXDoTiro = 0;
    //variavel que permite o personagem se movimentar
    private boolean move = false;
    private boolean ataque = false;
    private boolean desarmar = false;
    private boolean AuxiliarDeAnimacao = false;
    private String imageKey = null;
    private Element bombToDesarm;
    private boolean death = false;
    private int tempo;
    
    /*HUD*/
    HUD hud;
    //variáveis para números de pontos
    private int primeiroNumero;
    private int segundoNumero;
    private int terceiroNumero;

    /*********************
     * Ações do personagem
     *********************/
    public void doAction(Element element)
    {

        //Controle de Pontos da HUD
        primeiroNumero = Jogador.pontos/100;
        segundoNumero = (Jogador.pontos%100)/10;
        terceiroNumero = Jogador.pontos%10;

        for(int i = 0; i < 10; i++)
        {
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("primeiro" + i).setVisible(false);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("segundo" + i).setVisible(false);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("terceiro" + i).setVisible(false);
        }
        LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("primeiro" + primeiroNumero).setVisible(true);
        LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("segundo" + segundoNumero).setVisible(true);
        LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("terceiro" + terceiroNumero).setVisible(true);
        

        //enquando death e vidas não forem verdadeiras o jogador fará todas as ações abaixo
        if (death && vidas == 0)
        {
            imageKey = "morraPersonagem";
        } 
        else
        {
            if (move)
            {
                /*Movimentação do personagem*/
                
                switch (acao)
                {
                    /*case DIREITA_BAIXO:
                    element.doMove(+7, +7);
                    break;
                    case DIREITA_CIMA:
                    element.doMove(+7, -7);
                    break;
                    case ESQUERDA_BAIXO:
                    element.doMove(-7, +7);
                    break;
                    case ESQUERDA_CIMA:
                    element.doMove(-7, -7);
                    break;*/
                    case CIMA:
                        if (element.getY() > 50)
                        {
                            element.doMove(0, -7);
                            posicaoYDoTiro = -40;
                            posicaoXDoTiro = 20;
                            imageKey = "correrCima";
                        }
                        break;
                    case DIREITA:
                        if (element.getX() < 2950)
                        {
                            element.doMove(+7, 0);
                            imageKey = "correrDireita";
                            posicaoYDoTiro = -30;
                            posicaoXDoTiro = 20;
                        }
                        break;
                    case BAIXO:
                        if (element.getY() < 2950)
                        {
                            element.doMove(0, +7);
                            imageKey = "correrBaixo";
                            posicaoYDoTiro = 40;
                            posicaoXDoTiro = -20;
                        }
                        break;
                    case ESQUERDA:
                        if (element.getX() > 50)
                        {
                            element.doMove(-7, 0);
                            imageKey = "correrEsquerda";
                            posicaoYDoTiro = -30;
                            posicaoXDoTiro = -40;
                        }
                        break;
                    default:
                        break;
                }
            }

            //Condiçao para criar e lançar o tiro
            if (ataque)
            {
                Element tiro = new Element("tiro", (element.getX() + posicaoXDoTiro), (element.getY() + posicaoYDoTiro), LoadIMages.scenario);
                ImageCollection bulletImages = new ImageCollection();

                try
                {
                    bulletImages.add("tiroPersonagem", new SimpleImage("/tiro.png"));
                    bulletImages.setDefaultKey("tiroPersonagem");
                    bulletImages.addAttackRectangle("tiroPersonagem", new Rectangle(-3, -3, 6, 6), 0);
                } 
                catch (IOException ex)
                {
                    Logger.getLogger(ControleDoPersonagem.class.getName()).log(Level.SEVERE, null, ex);
                }
                
                /*Coloca o tiro na engine*/
                tiro.setImageCollection(bulletImages);
                tiro.setCollisionListener(new CollisionTiroPersonagem());
                tiro.setDoNotStop(true);
                GameSystem.getInstance().getAIEngine().setIAElement(tiro, new ControleDoTiroPersonagem(acao));
                GameSystem.getInstance().getElementCollection().addElement(tiro);

                // Finaliza o ataque
                ataque = false;
            }

            //Condições abaixo mantem a imagem da última posção em que o personagem está virado
            if (acao == Direcoes.CIMA && AuxiliarDeAnimacao)
            {
                imageKey = "personagemCima";
            }
            if (acao == Direcoes.BAIXO && AuxiliarDeAnimacao)
            {
                imageKey = "personagemBaixo";
            }
            if ((acao == Direcoes.ESQUERDA || acao == Direcoes.ESQUERDA_BAIXO || acao == Direcoes.ESQUERDA_CIMA) && AuxiliarDeAnimacao)
            {
                imageKey = "personagemEsquerda";
            }
            if ((acao == Direcoes.DIREITA || acao == Direcoes.DIREITA_BAIXO || acao == Direcoes.DIREITA_CIMA) && AuxiliarDeAnimacao)
            {
                imageKey = "personagemDireita";
            }

            //imagem do personagem desativando a bomba
            if (desarmar)
            {
                imageKey = "desarmar";
            }

        }
        element.setImageKey(imageKey);

        //Condições que mudam as vidas na HUD
        if(vidas == 3)
        {
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("umaVida").setVisible(false);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("duasVidas").setVisible(false);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("tresVidas").setVisible(true);
        }
        else if (vidas == 2)
        {
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("umaVida").setVisible(false);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("duasVidas").setVisible(true);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("tresVidas").setVisible(false);
        }
        else if (vidas == 1)
        {
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("umaVida").setVisible(true);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("duasVidas").setVisible(false);
            LoadIMages.scenario.getScenarioLayer("HUD").getScenarioItem("tresVidas").setVisible(false);
        }
        
        //Condições de direção do personagem
        if (Keyboard.keyLeft)
        {
            acao = Direcoes.ESQUERDA;
            move = true;
            AuxiliarDeAnimacao = false;
        } 
        else if (Keyboard.keyRight)
        {
            acao = Direcoes.DIREITA;
            move = true;
            AuxiliarDeAnimacao = false;
        } 
        else if (Keyboard.keyUp)
        {
            acao = Direcoes.CIMA;
            move = true;
            AuxiliarDeAnimacao = false;
        } 
        else if (Keyboard.keyDown)
        {
            acao = Direcoes.BAIXO;
            move = true;
            AuxiliarDeAnimacao = false;
        }
        else if (!Keyboard.keyUp && !Keyboard.keyDown && !Keyboard.keyLeft && !Keyboard.keyRight)
        {
            move = false;
            AuxiliarDeAnimacao = true;
        } 
        
 
        if(tempo != 0)
            tempo--;
          
        //condição de ataque do personagem
        if (Keyboard.SPACEBAR && acao != Direcoes.NENHUM)
        {
            if(tempo == 0)
            {
            ataque = true;
            tempo = 20;
            }
        }
    }

    public void receiveMessage(String message)
    {

        if (message.equals("desarmar"))
        {
            //envia mensagem até a bomba dizendo que ela é para ser desarmada
            desarmar = true;
            if (bombToDesarm != null)
            {
                GameSystem.getInstance().getAIEngine().sendMessage(bombToDesarm, "desarmar", 0);
            }
        } 
        else if (message.equals("pararDesarmar"))
        {
             //envia mensagem até a bomba dizendo que ela deve para de ser desarmada
            desarmar = false;
            if (bombToDesarm != null)
            {
                GameSystem.getInstance().getAIEngine().sendMessage(bombToDesarm, "pararDesarmar", 0);
            }
        }      
        else if (message.equals("voltarAtaque"))
        {
            ataque = false;
        } 
        else if (message.indexOf("desarmar") != -1)
        {
            String elementName = message.substring(9);
            bombToDesarm = GameSystem.getInstance().getElementCollection().getElementByName(elementName);
        } 
        else if (message.equals("morraPersonagem"))
        {
           death = true;
           //tira a vida do personagem caso seja atingido por um tiro
           vidas--;
        }
    }
}
